home *** CD-ROM | disk | FTP | other *** search
/ Aminet 7 / Aminet 7 - August 1995.iso / Aminet / comm / net / DialupV3_03.lha / dialup / commands.c < prev    next >
C/C++ Source or Header  |  1994-11-03  |  7KB  |  259 lines

  1. #include "dialup.h"
  2.  
  3. extern BPTR                    mystderr;
  4. extern const UBYTE             *prgname;
  5. extern struct IOExtSer        *serialIOReq;
  6. extern struct timerequest    *timereq;
  7. extern BPTR                    repfile;
  8. extern UBYTE                *rxbuffer;
  9. extern LONG                    arg[];
  10. extern struct argspec        argtab[];
  11.  
  12. BOOL
  13. take( UBYTE *varbuf )
  14.     {
  15.     UBYTE rgcnt;
  16.  
  17.     if ( *(UBYTE *)arg[A_MSC] ) VERIFY ( sendEx( (UBYTE *)arg[A_MSC], (UBYTE *)arg[A_MOK], 3 ) ); /* set modem config (usually a RESET) */
  18.     if ( !arg[A_NDI] ) VERIFY ( sendEx( "AT&D0", (UBYTE *)arg[A_MOK], 2 ) ); /* ignore DTR ? */
  19.  
  20.     /* wait for A_RGS rings without timeout */
  21.     do
  22.         for(rgcnt = 0; rgcnt < *((LONG *)arg[A_RGS]); rgcnt++)
  23.             if ( !expectFromSer( (UBYTE *)arg[A_MRG], *((LONG *)arg[A_RGS]) > 0 && rgcnt == 0 ? 0x7FFFFFFF : 3) )
  24.                 break;
  25.     while ( rgcnt < *((LONG *)arg[A_RGS]) && !strstr(rxbuffer, BREAKSTR) ); /* count again, if timeout (not enough rings) but no user break */
  26.  
  27.     VERIFY ( !strstr(rxbuffer, BREAKSTR) );
  28.     VERIFY ( sendEx( (UBYTE *)arg[A_MOH], (UBYTE *)arg[A_MAC], *(LONG *)arg[A_MCT] ) );    /* take call */
  29.     VERIFY ( checkconnect(varbuf) );
  30.  
  31.     _OK_;
  32.     }
  33.  
  34.  
  35. BOOL
  36. connect(UBYTE *varbuf)
  37.     {
  38.     UBYTE PNidx = 0;
  39.     UBYTE lastPNidx = 0;
  40.     UBYTE **PNA;
  41.  
  42.     PNA = (UBYTE **)arg[A_PN];
  43.  
  44.     if ( *(UBYTE *)arg[A_MSC] )    VERIFY ( sendEx( (UBYTE *)arg[A_MSC], (UBYTE *)arg[A_MOK], 3 ) ); /* set modem config (usually a RESET) */
  45.     if ( !arg[A_NDI] ) VERIFY ( sendEx( "AT&D0", (UBYTE *)arg[A_MOK], 2 ) ); /* ignore DTR ? */
  46.  
  47.     loop    /* redial loop */
  48.         {
  49.         if ( !arg[A_NRC] || arg[A_AA] ) /* reconnect or autoanswer ? */
  50.             {
  51.             sprintf(varbuf, (UBYTE *)arg[A_MAAC], *((LONG *)arg[A_RGS]) );
  52.             VERIFY ( sendEx( varbuf, (UBYTE *)arg[A_MOK], 2 ) );
  53.             };
  54.  
  55.         /* dial or enter local analog loopback: */
  56.         if        ( arg[A_TEST] )                        sprintf(varbuf, "%s",    (UBYTE *)arg[A_MTC]);
  57.         else if ( *PNA[PNidx] == '!' )                sprintf(varbuf, "%s",    PNA[PNidx] + 1 );
  58.         else if ( ABBREV( PNA[PNidx], "AT" ) )        sprintf(varbuf, "%s",    PNA[PNidx] );
  59.         else                                           sprintf(varbuf, "ATD%s", PNA[PNidx] );
  60.  
  61.         VERIFY ( sendLine( varbuf ) );
  62.         sprintf(varbuf, "%s|%s|%s|%s", arg[A_MLB], arg[A_MNC], arg[A_MAC], arg[A_MLD]);
  63.         VERIFY ( expectFromSer( varbuf, arg[A_TEST] ? 5 : *(LONG *)arg[A_MCT] ) );
  64.  
  65.         if ( ! sStrMatch(rxbuffer, (UBYTE *)arg[A_MLB], varbuf ) )
  66.     break;    /* Do not redial if anything else than BUSY */
  67.  
  68.         DisplayBeep(NULL);
  69.         /* switch to next number */
  70.         if ( !PNA[++PNidx] )
  71.             {
  72.             PNidx = 0;
  73.             if ( *(LONG *)arg[A_RDD] == 0 ) _FAIL_;    /* no redial of the nuber(s) at all! */
  74.             };
  75.  
  76.         if ( !arg[A_NRC] || arg[A_AA] ) /* reconnect or autoanswer ? */
  77.             { /* set modem to not auto answer during wait: */
  78.             sprintf(varbuf, (UBYTE *)arg[A_MAAC], 0 );
  79.             VERIFY ( sendEx( varbuf, (UBYTE *)arg[A_MOK], 2 ) );
  80.             };
  81.  
  82.         if ( strcmp(PNA[lastPNidx], PNA[PNidx]) == 0 || PNidx == 0)    /* same number or first one again? Then wait a bit. */
  83.             VERIFY ( expectFromSer( NULL, *(LONG *)arg[A_RDD] ) );
  84.         lastPNidx = PNidx;
  85.         };
  86.  
  87.     /* What did modem say: */
  88.     if ( sStrMatch(rxbuffer, (UBYTE *)arg[A_MLD], varbuf ) )
  89.         {
  90.         msg("Sorry! Modem doesn't get a dialtone.");
  91.         _FAIL_;
  92.         }
  93.     else
  94.         VERIFY ( checkconnect( varbuf ) );
  95.  
  96.     if ( arg[A_WBW] && *(LONG *)arg[A_WBW] > 0 ) expectFromSer( NULL, *(LONG *)arg[A_WBW] );
  97.  
  98.     if ( arg[A_WUS] && *((UBYTE *)arg[A_WUS]) )    VERIFY ( sendToSer( (UBYTE *)arg[A_WUS] ) );
  99.  
  100.     if ( arg[A_LIP] && *((UBYTE *)arg[A_LIP]) )
  101.         {
  102.         /* handle login prompt */
  103.         if ( arg[A_TEST] )
  104.             {
  105.             sprintf(varbuf, "\n\n**TEST: %s", arg[A_LIP] == argtab[A_LIP].deflt ? "Login:" : (UBYTE *)arg[A_LIP]);
  106.             VERIFY ( sendToSer( varbuf ) );
  107.             };
  108.         VERIFY ( exSend( (UBYTE *)arg[A_LIP], *((LONG *)arg[A_LTO]), (UBYTE *)arg[A_LIN] ) );
  109.         };
  110.     
  111.     /* handle password prompt */
  112.     if ( arg[A_PWP] && *((UBYTE *)arg[A_PWP]) )
  113.         {
  114.         if ( arg[A_TEST] )
  115.             {
  116.             sprintf(varbuf, "\n\n**TEST: %s", arg[A_PWP] == argtab[A_PWP].deflt ? "Password:" : (UBYTE *)arg[A_PWP]);
  117.             VERIFY ( sendToSer( varbuf) );
  118.             };
  119.         VERIFY ( exSend( (UBYTE *)arg[A_PWP], 10, (UBYTE *)arg[A_PW] ) );
  120.         };
  121.  
  122.     /* handle snd login prompt */
  123.     if ( arg[A_SLIN] && *((UBYTE *)arg[A_SLIN]) )
  124.         {
  125.         if ( arg[A_TEST] )
  126.             {
  127.             sprintf(varbuf, "\n\n**TEST: %s", arg[A_SLIP] == argtab[A_SLIP].deflt ? "2. Login:" : (UBYTE *)arg[A_SLIP]);
  128.             VERIFY ( sendToSer( varbuf) );
  129.             };
  130.         VERIFY ( exSend( (UBYTE *)arg[A_SLIP], *((LONG *)arg[A_LTO]), (UBYTE *)arg[A_SLIN] ) );
  131.         };
  132.  
  133.     /* handle snd pw prompt */
  134.     if ( arg[A_SPW] && *((UBYTE *)arg[A_SPW]) )
  135.         {
  136.         if ( arg[A_TEST] )
  137.             {
  138.             sprintf(varbuf, "\n\n**TEST: %s", arg[A_SPWP] == argtab[A_SPWP].deflt ? "2. Password:" : (UBYTE *)arg[A_SPWP]);
  139.             VERIFY ( sendToSer( varbuf) );
  140.             };
  141.         VERIFY ( exSend( (UBYTE *)arg[A_SPWP], 10, (UBYTE *)arg[A_SPW] ) );
  142.         };
  143.  
  144.     /* check remote response for successful login: */
  145.     if ( arg[A_LOK] && *((UBYTE *)arg[A_LOK])  )
  146.         {
  147.         if ( arg[A_TEST] )
  148.             {
  149.             sprintf(varbuf, "\n\n**TEST: %s", (UBYTE *)arg[A_LOK]);
  150.             VERIFY ( sendToSer( varbuf) );
  151.             };
  152.         VERIFY ( expectFromSer( (UBYTE *)arg[A_LOK], *((LONG *)arg[A_LOT]) ) );
  153.  
  154.         if ( repfile ) Write(repfile, WS("\n"));
  155.         };
  156.  
  157.     _OK_;
  158.     }
  159.  
  160. BOOL
  161. hangup(UBYTE *varbuf)
  162.     {
  163.     if ( carrier() )
  164.         {
  165.         VERIFY ( commandmode(varbuf) );
  166.         VERIFY ( dropline(varbuf) );
  167.         }
  168.     else
  169.         {
  170.         VERIFY ( sendEx( (UBYTE *)arg[A_MRC], "?*\r", 3) )
  171.         Delay(25);
  172.         }        
  173.  
  174.     if ( arg[A_AA])
  175.         {
  176.         if ( arg[A_MSC] && *(UBYTE *)arg[A_MSC] ) VERIFY ( sendEx( (UBYTE *)arg[A_MSC], (UBYTE *)arg[A_MOK], 3 ) ); /* set modem *connect* config (usually a RESET) */
  177.         sprintf(varbuf, (UBYTE *)arg[A_MAAC], *(LONG *)arg[A_RGS] );    /* modem autoanswer */
  178.         VERIFY ( sendEx( varbuf, (UBYTE *)arg[A_MOK], 2 ) );
  179.         if ( !arg[A_NDI] ) VERIFY ( sendEx( "AT&D0", (UBYTE *)arg[A_MOK], 2 ) ) ;    /* ignore DTR  */
  180.         }
  181.     else
  182.         {
  183.         if ( arg[A_MSC] && *(UBYTE *)arg[A_MSH] ) VERIFY ( sendEx( (UBYTE *)arg[A_MSH], (UBYTE *)arg[A_MOK], 3 ) ); /* set modem hangup config (usually a RESET) */
  184.         if ( !arg[A_NRC] )
  185.             {
  186.             sprintf(varbuf, (UBYTE *)arg[A_MAAC], 0 ); /* set modem to not auto answer: */
  187.             VERIFY ( sendEx( varbuf, (UBYTE *)arg[A_MOK], 2 ) );
  188.             }
  189.         if ( !arg[A_NDI] ) VERIFY ( sendEx( "AT&D2", (UBYTE *)arg[A_MOK], 2 ) ); /* honor DTR again: */
  190.         }
  191.  
  192.     _OK_;
  193.     }
  194.  
  195. BOOL
  196. commandmode(UBYTE *varbuf)
  197.     {
  198.     BPTR temp = repfile;
  199.  
  200.     Delay(50); /* send +++ : */
  201.     VERIFY ( sendToSer( (UBYTE *)arg[A_MOC] ) );
  202.     sprintf(varbuf, "%s|%s", (UBYTE *)arg[A_MOK], arg[A_MNC]);
  203.     repfile = NULL;
  204.     if ( !expectFromSer( (UBYTE *) varbuf, 3 ) )
  205.         {
  206.         repfile = temp;
  207.         VERIFY ( sendEx( (UBYTE *)arg[A_MRC], (UBYTE *)arg[A_MOK], 2 ) );  /* maybe already offline ? */
  208.         }
  209.     else repfile = temp;
  210.     _OK_;
  211.     }
  212.  
  213. BOOL
  214. dropline(UBYTE *varbuf)
  215.     {
  216.     if ( !arg[A_TEST] )    /* hangup line (ATH0) */
  217.         VERIFY ( sendEx( (UBYTE *)arg[A_MHC], (UBYTE *)arg[A_MOK], 2 ) )
  218.     else
  219.         {
  220.         sprintf( varbuf, "%s|%s", (UBYTE *)arg[A_MOK], arg[A_MNC]);
  221.         VERIFY ( sendEx( (UBYTE *)arg[A_MTO], varbuf, 2 ) );
  222.         };
  223.  
  224.     _OK_;
  225.     }
  226.  
  227.  
  228. BOOL
  229. query(UBYTE *varbuf)
  230.     {
  231.     BOOL connected = carrier();
  232.  
  233.     if ( connected ) VERIFY ( commandmode(varbuf) );
  234.     VERIFY ( sendEx( (UBYTE *)arg[A_MQC], (UBYTE *)arg[A_MOK], 8 ) );
  235.     if ( connected ) VERIFY ( sendEx( (UBYTE *)arg[A_MLC], (UBYTE *)arg[A_MAC], 2 ) );
  236.  
  237.     _OK_;
  238.     }
  239.  
  240.  
  241. BOOL
  242. checkconnect(UBYTE *buf)
  243.     {
  244.     UBYTE *anycon;
  245.  
  246.     if ( !(anycon = sStrMatch(rxbuffer, (UBYTE *)arg[A_MAC], buf ) ) )
  247.         {
  248.         msg(rxbuffer);
  249.         _FAIL_;
  250.         }
  251.     else
  252.         {
  253.         if ( arg[A_CS] && !sStrMatch(rxbuffer, (UBYTE *)arg[A_CS], buf) )
  254.             msg("Modem handshake result:\n %s", anycon);
  255.         _OK_;
  256.         };
  257.     }
  258.  
  259.